Das Hilfethema Testing und Debugging unterscheidet Syntaxfehler und logische Fehler. Beide Fehler können zur Entwicklungszeit (engl. at compile time) oder zur Laufzeit (engl. at run time) auftreten. Während praktisch alle Syntaxfehler von der Enwicklungsumgebung erkannt werden, liegt es am Entwickler, logische Fehler möglichst früh durch systematisches Testen und unter Nutzung des Debuggers zu entdecken. In der Regel ist es aber nicht möglich, alle Fehler vorausschauend zu vermeiden. Die meisten Programmiersprachen lassen deshalb Fehlerbehandlungscode zu, der die Auswirkungen später auftretender Fehler minimiert.
Je nach Entwicklungswerkzeug, kann die Fehlerbehandlung unterschiedlich sein. MS Access behandelt zum Beispiel Formular- und Berichtsfehler, VBA-Fehler im engeren Sinn und Fehler, die in DAO- und ADO-Objekten auftreten, verschieden. Dieses Hilfethema fasst die einfachste Form der Fehlerbehandlung in Formular- und Berichtsmodulen sowie in VBA-Prozeduren zusammen.
Der Fehlerbehandlungscode für ein Formular- oder Berichtsmodul fängt Fehler ab, die auftreten, wenn der Fokus auf dem Formular oder Bericht liegt. Der Entwickler kann aus der Eigenschaftenliste eines Formulars oder Berichts das Skelett der Reaktion auf das Ereignis 'Bei Fehler' generieren lassen. Diese Ereignisprozedur wird dann ausgeführt, wenn ein Laufzeitfehler vom Formular- oder Berichtsmodul entdeckt wird. Typische Laufzeitfehler in Formularen sind:
Der Benutzer unterlässt die Eingabe in ein Mussfeld.
Der Datentyp der Eingabe ist ungültig (z.B. alphabetisch statt numerisch).
Die Eingabe stammt nicht aus der vorgegebenen Werteliste.
Die Eingabe existiert bereits (doppelt eingegebener Primärschlüssel).
Meist ist es unmöglich, auf alle Fehler spezifisch - vor allem unter Berücksichtigung des Benutzers - zu reagieren. Am Ende des Fehlerbehandlungscode steht deshalb meist eine Catch All-Anweisung, die immer dann eine systemdefinierte Meldung anzeigt, wenn der Fehler nicht bereits abgefangen worden ist.
Der folgende Fehlerbehandlungscode reagiert auf zwei unzulässige Zeitbudget-Eingaben im Formular FrmEssay und auf die übrigen Fehler mit einer Catch All-Anweisung:
Private Sub Form_Error(DataErr As Integer, Response As Integer) If DataErr = cNrDatentypUngültig Then MsgBox "Geben Sie eine Zahl ein.", vbOKOnly+vbExclamation, cHdDatentypUngültig Me.Undo Response = acDataErrContinue ElseIf DataErr = cNrGültigkeitsregelVerletzt Then 'Formulareigenschaft 'Gültigkeitsmeldung' anzeigen und fehlerhafte Eingabe löschen Me.Undo Else MsgBox "'" & DataErr & " " & Error(DataErr) & "' im Formular " & "ESSAYAUFGABE", vbOKOnly + vbExclamation, cHdDefault Response = acDataErrContinue End If End Sub
Die Prozedur Form_Error importiert
nach einem Laufzeitfehler den systemdefinierten
Fehlercode
DataErr. In Abhängigkeit von seinem Wert reagiert die
Prozedur. cNrDatentypUngültig
ist eine benutzerdefinierte benannte
Konstante für die systemdefinierte Zahl 2113. Nach dem Auftreten des
Fehlers 2113 macht Me.Undo die letzte Eingabe des Formulars rückgängig und
fordert den Benutzer auf, eine Zahl statt einer alphabetischen Eingabe
einzugeben. cHdDatentypUngültig = "Datentyp ungültig" ist der
benutzerdefinierte Standardtitel der Meldung. Mit dem Ausgabeargument
Response = acDataErrContinue informiert die Fehlerprozedur das Laufzeitsystem
von MS Access, dass es den Code ohne Standard-Fehlermeldung fortsetzen soll.
Die Meldung auf den Fehler cNrGültigkeitsregelVerletzt ist leer, weil eine entsprechende Meldung bereits von den folgenden Eigenschaften des Textfelds TxfZeitbudget definiert wird:
Gültigkeitsregel: ">=1 Und <=90"
Gültigkeitsmeldung: "Geben Sie einen Wert zwischen 1 und 90 Minuten ein".
Die Reaktion beschränkt sich deshalb darauf, die letzte Eingabe in das Textfeld rückgängig zu machen. Weil Response kein Wert zugewiesen wird, benutzt MS Access die im Eigenschaftenfenster definierte Gültigkeitsmeldung.
Wenn der Entwickler einen Fehlercode nicht spezifisch beantwortet, zeigt MS Access eine Standardfehlermeldung an. Diese kann die Entwicklerin durch eine eigene Catch All-Anweisung teilweise ersetzen. Die oben definierte Catch All-Meldung gibt einen Text des folgenden Formats aus: "'<Standardfehlertext>' im Formular ESSAYAUFGABE". Die Funktion Error(DataErr) ergibt den Standardfehlertext. cHdDefault verweist auf den Titel "Bitte notieren Sie die Fehlermeldung für Ihren PC-Koordinator.".
Wenn die Entwicklerin keinen Fehlerbehandlungscode schreibt, führt jeder Laufzeitfehler zur Anzeige einer systemdefinierten Fehlermeldung und zum Programmende. Wenn die Entwicklerin hingegen eine On Error GoTo-Anweisung zu einer VBA-Prozedur hinzufügt, verzweigt Visual Basic beim Auftreten eines Laufzeitfehlers automatisch in eine Fehlerbehandlungsprozedur.
Private Sub MCErgebnisskelette_Einfügen(lfTestschlüssel As Long) 'Vereinbarungen '... On Error GoTo Fehlerbehandlung 'Code, der Skelette für Mehrfachwahlergebnisse einfügt '... Exit Sub 'Fehlerbehandlung überspringen Fehlerbehandlung: If Err.Number = cPrimärschlüsselDoppelt Then MsgBox "Skelett bereits vorhanden.", vbOKOnly+vbExclamation, cHdPrimärschlüsselDoppelt End If End Sub
Fehlerbehandlung ist eine benutzerdefinierte Marke, worauf die Prozedur nach einem Laufzeitfehler springt. Number ist eine Eigenschaft des Fehlerobjekts Err. Ein Fehler füllt die Eigenschaften des Err-Objekts mit Information, welche den Fehler sowie die Informationen, die zur Verarbeitung des Fehlers verwendet werden können, identifizieren.